using System;
using System.Runtime.InteropServices;

namespace LDNS.SDK.Utilities
{
    /// <summary>
    /// 平台相关的辅助工具类
    /// 提供跨平台兼容性支持和平台特定功能
    /// 作者：huobing
    /// </summary>
    public static class PlatformHelper
    {
        /// <summary>
        /// 检查当前进程是否以管理员权限运行
        /// 注意：此方法仅在Windows平台上受支持
        /// </summary>
        /// <returns>如果在Windows平台上以管理员权限运行则返回true，否则返回false</returns>
        public static bool IsRunAsAdministrator()
        {
            // 检查是否在Windows平台上运行
            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                // 在非Windows平台上返回false
                return false;
            }

            // Windows平台特定实现
            try
            {
                using (var identity = System.Security.Principal.WindowsIdentity.GetCurrent())
                {
                    var principal = new System.Security.Principal.WindowsPrincipal(identity);
                    return principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator);
                }
            }
            catch (Exception)
            {
                // 发生异常时返回false
                return false;
            }
        }

        

        /// <summary>
        /// 以管理员权限重启当前应用程序
        /// 作者：huobing
        /// </summary>
        /// <returns>如果成功启动管理员权限的进程，则返回true</returns>
        public static bool RunAsAdministrator()
        {
            try
            {
                // 获取当前应用程序的路径
                string? exePath = Environment.ProcessPath;
                if (string.IsNullOrEmpty(exePath))
                {
                    exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
                }
                
                if (string.IsNullOrEmpty(exePath))
                {
                    Console.WriteLine("[错误] 无法获取应用程序路径");
                    return false;
                }
                
                // 获取当前的命令行参数
                string? commandLineArgs = Environment.CommandLine;
                string arguments = string.Empty;
                
                if (!string.IsNullOrEmpty(commandLineArgs) && commandLineArgs.Length > exePath.Length)
                {
                    // 提取除了exe路径外的所有参数，并处理引号情况
                    if (commandLineArgs.StartsWith('"') && commandLineArgs.IndexOf('"') == 0)
                    {
                        // 处理带引号的路径
                        int endQuote = commandLineArgs.IndexOf('"', 1);
                        if (endQuote > 0 && endQuote + 1 < commandLineArgs.Length)
                        {
                            arguments = commandLineArgs.Substring(endQuote + 1).TrimStart();
                        }
                    }
                    else
                    {
                        // 简单情况：直接从exe路径后截取
                        arguments = commandLineArgs.Substring(exePath.Length).TrimStart();
                    }
                }
                
                // 创建进程启动信息
                var startInfo = new System.Diagnostics.ProcessStartInfo
                {
                    FileName = exePath,
                    Arguments = arguments,
                    UseShellExecute = true,
                    Verb = "runas", // 以管理员权限运行
                    WorkingDirectory = AppContext.BaseDirectory,
                    CreateNoWindow = false
                };
                
                // 启动新进程
                System.Diagnostics.Process.Start(startInfo);
                return true;
            }
            catch (System.ComponentModel.Win32Exception ex)
            {
                // 用户取消了管理员权限请求
                if (ex.NativeErrorCode == 1223) // ERROR_CANCELLED
                {
                    Console.WriteLine("[错误] 管理员权限被取消，无法继续运行");
                }
                else
                {
                    Console.WriteLine($"[错误] 无法以管理员权限重启程序: {ex.Message}");
                }
                return false;
            }
            catch (Exception ex)
            {
                Console.WriteLine($"[错误] 提权失败: {ex.Message}");
                return false;
            }
        }

        /// <summary>
        /// 解除注册表编辑限制
        /// 删除HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System中的DisableRegistryTools值
        /// 注意：此方法仅在Windows平台上受支持
        /// </summary>
        /// <returns>是否成功解除限制</returns>
        public static bool UnlockRegistryEditing()
        {
            // 检查是否在Windows平台上运行
            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                return false;
            }

            try
            {
                // 需要管理员权限来修改此设置
                if (!IsRunAsAdministrator())
                {
                    return false;
                }

                using (var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(
                    "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", 
                    true))
                {
                    if (key != null && key.GetValue("DisableRegistryTools") != null)
                    {
                        key.DeleteValue("DisableRegistryTools", false);
                        return true;
                    }
                }
                // 如果键不存在或值不存在，也视为成功
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
    }
}